package org.ghost.wechat.platform.dao;

import feign.Response;
import org.ghost.wechat.platform.config.feign.FeignCommonConfig;
import org.ghost.wechat.platform.dto.WeChatErrorRspDTO;
import org.ghost.wechat.platform.dto.wechat.material.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author 01
 */
@FeignClient(url = "https://api.weixin.qq.com", configuration = FeignCommonConfig.class)
public interface IWeChatMaterialDAO {
    /**
     * 新增永久图文素材
     * https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      图文数据
     * @return
     */
    @PostMapping(value = "cgi-bin/material/add_news", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = {MediaType.APPLICATION_JSON_UTF8_VALUE})
    WeChatAddNewsRspDTO addNews(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatAddNewsReqDTO reqDTO);

    /**
     * 上传图文消息内的图片获取URL
     * https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html
     * 本接口所上传的图片不占用公众号的素材库中图片数量的100000个的限制。图片仅支持jpg/png格式，大小必须在1MB以下
     *
     * @param accessToken 调用接口凭据
     * @param media       form-data中媒体文件标识，有filename、filelength、content-type等信息
     * @return
     */
    @PostMapping(value = "cgi-bin/media/uploadimg", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    WeChatUploadImgRspDTO uploadImg(@RequestParam(value = "access_token") String accessToken, @RequestPart(value = "media") MultipartFile media);

    /**
     * 新增其他类型永久素材(新增永久视频素材需特别注意)
     * https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html
     *
     * @param accessToken 调用接口凭据
     * @param type        媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）
     * @param media       form-data中媒体文件标识，有filename、filelength、content-type等信息
     * @return
     */
    @PostMapping(value = "cgi-bin/material/add_material", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    WeChatAddMaterialRspDTO addMaterial(@RequestParam(value = "access_token") String accessToken, @RequestParam(value = "type") String type, @RequestPart(value = "media") MultipartFile media);

    /**
     * 新增永久视频素材
     * https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html
     *
     * @param accessToken 调用接口凭据
     * @param type        媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）
     * @param media       form-data中媒体文件标识，有filename、filelength、content-type等信息
     * @param reqDTO      视频描述信息
     * @return
     */
    @PostMapping(value = "cgi-bin/material/add_material", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    WeChatAddMaterialRspDTO addVideo(@RequestParam(value = "access_token") String accessToken, @RequestParam(value = "type") String type,
                                     @RequestPart(value = "media") MultipartFile media, @RequestBody WeChatAddVideoReqDTO reqDTO);

    /**
     * 获取永久素材(图片,语音等)
     * https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Getting_Permanent_Assets.html
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      请求参数
     * @return
     */
    @PostMapping(name = "cgi-bin/material/get_material")
    Response getMaterial(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatGetMaterialReqDTO reqDTO);

    /**
     * 获取永久素材(视频url)
     * https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Getting_Permanent_Assets.html
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      请求参数
     * @return
     */
    @PostMapping(name = "cgi-bin/material/get_material")
    WeChatGetVideoRspDTO getVideoUrl(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatGetMaterialReqDTO reqDTO);

    /**
     * 获取永久素材(图文消息)
     * https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Getting_Permanent_Assets.html
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      请求参数
     * @return
     */
    @PostMapping(name = "cgi-bin/material/get_material")
    WeChatGetNewsRspDTO getNews(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatGetMaterialReqDTO reqDTO);

    /**
     * 删除永久素材(临时素材无法通过本接口删除)
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      请求参数
     * @return
     */
    @PostMapping(name = "cgi-bin/material/del_material")
    WeChatErrorRspDTO deleteMaterial(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatGetMaterialReqDTO reqDTO);

    /**
     * 更新永久素材(图文消息)
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      请求参数
     * @return
     */
    @PostMapping(name = "cgi-bin/material/update_news")
    WeChatErrorRspDTO updateNews(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatUpdateNewsReqDTO reqDTO);

    /**
     * 获取永久素材的总数
     *
     * @param accessToken 调用接口凭据
     * @return
     */
    @GetMapping(name = "cgi-bin/material/get_materialcount")
    WeChatGetMaterialCountRspDTO getMaterialCount(@RequestParam(value = "access_token") String accessToken);

    /**
     * 批量获取永久素材(图片,语音,视频)
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      请求参数
     * @return
     */
    @PostMapping(name = "cgi-bin/material/batchget_material")
    WeChatBatchGetMaterialRspDTO<WeChatBatchGetMaterialVideoDTO> batchGetMaterial(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatBatchGetMaterialReqDTO reqDTO);

    /**
     * 批量获取永久素材(图文消息)
     *
     * @param accessToken 调用接口凭据
     * @param reqDTO      请求参数
     * @return
     */
    @PostMapping(name = "cgi-bin/material/batchget_material")
    WeChatBatchGetMaterialRspDTO<WeChatBatchGetNewsDTO> batchGetNews(@RequestParam(value = "access_token") String accessToken, @RequestBody WeChatBatchGetMaterialReqDTO reqDTO);
}
